package com.ttxs.controller;

import com.ttxs.utils.FileUtils;
import com.ttxs.utils.csv.CsvUtils;
import com.ttxs.utils.json.JsonUtils;
import com.ttxs.utils.xml.XmlUtils;
import com.ttxs.utils.yaml.YamlUtils;

import java.io.File;
import java.util.regex.Pattern;

/**
 * 文件格式处理入口类
 *
 * @author cwt
 * @version 1.0
 */
public class FileFormatHandling {
    public static void main(String[] args) {
        //用于截取输入文件格式，输出文件格式
        String type = null;
        String inputType = null;
        String outputType = null;
        //参数个数验证 -v 只需两个参数
        if (args.length == 2 && ("-v".equals(args[0]) || "-c".equals(args[0]))) {
            type = args[0];
            inputType = args[1];
            outputType = "text.csv";    //虚拟
            //格式验证|压缩，只需要两个参数
        } else if (args.length == 3 && ("-t".equals(args[0]) || "-f".equals(args[0]))) {
            type = args[0];
            inputType = args[1];
            outputType = args[2];
        } else {
            System.err.println("参数个数不匹配！参数列表：[-t|-c|-f|-v]  \"输入文件路径\" [\"输出文件路径\"]?");
            System.exit(0);
        }
        //[A-Za-z0-9_]  校验路径的正确性
        String regex = "^(\\w:[/|\\\\])?(\\w*[/|\\\\])*\\w+\\.\\w{1,4}$";
        //校验文件路径
        boolean matches1 = Pattern.matches(regex, inputType);
        boolean matches2 = Pattern.matches(regex, outputType);
        if (!matches1 || !matches2) {
            System.err.println("请输入合法的路径！");
            System.exit(0);
        }
        //验证输入文件是否存在
        File file = new File(args[1]);
        if (!file.exists()) {
            System.err.println("输入文件不存在！");
            System.exit(0);
        }
        //截取输入文件格式，输出文件格式
        inputType = args[1].substring(args[1].lastIndexOf(".") + 1);
        if (args.length > 2) {
            outputType = args[2].substring(args[2].lastIndexOf(".") + 1);
        }
        dealWithType(type, inputType, outputType, args);
    }

    /***
     * 业务匹配
     * @param inputType 输入文件类型
     * @param outputType 输出文件类型
     * @param type 业务选择  -t 格式转换 -f 格式化  -v 格式验证
     * @author cwt
     */

    private static void dealWithType(String type, String inputType, String outputType, String[] args) {
        if ("-v".equalsIgnoreCase(type)) {
            Boolean isLegal = null; //是否合法的标记
            if ("json".equalsIgnoreCase(inputType)) {
                isLegal = JsonUtils.jsonValidator(args[1]);
            } else if ("csv".equalsIgnoreCase(inputType)) {
                isLegal = CsvUtils.csvValidator(args[1]);
            } else if ("xml".equalsIgnoreCase(inputType)) {
                isLegal = XmlUtils.xmlValidator(args[1]);
            } else if ("yaml".equalsIgnoreCase(inputType)) {
                isLegal = YamlUtils.yamlValidator(args[1]);
            } else {
                System.out.println("本程序暂不支持 " + inputType + " 文件类型！！！");
            }
            //合法性提示
            if (isLegal != null) {
                if (isLegal) {
                    System.out.println("格式通过验证，格式正确");
                } else {
                    System.err.println("该文件内容格式错误！！！");
                }
            }
        } else {
            String content = null; // 用于接收转化内容
            if ("-c".equalsIgnoreCase(type)) {
                if ("json".equalsIgnoreCase(inputType)) {
                    content = JsonUtils.jsonCompress(args[1]);
                } else if ("xml".equalsIgnoreCase(inputType)) {
                    content = XmlUtils.convertFromXml(args[1]);
                } else {
                    System.out.println("压缩只支持JSON、XML格式，暂不支持其他格式");
                }
            } else if ("-f".equalsIgnoreCase(type)) {
                if ("json".equalsIgnoreCase(inputType)) {
                    content = JsonUtils.jsonFormatter(args[1]);
                } else if ("csv".equalsIgnoreCase(inputType)) {
//                    content = CsvUtils.csvFormatter(args[1]);
                    CsvUtils.csvFormatter(args[1], args[2]);
                } else if ("xml".equalsIgnoreCase(inputType)) {
                    content = XmlUtils.xmlFormatter(args[1]);
                } else if ("yaml".equalsIgnoreCase(inputType)) {
                    content = YamlUtils.yamlFormatter(args[1]);
                } else {
                    System.out.println("本程序暂不支持 " + inputType + " 文件类型！！！");
                }
            } else if ("-t".equalsIgnoreCase(type)) {
                if ("json".equalsIgnoreCase(inputType) && "xml".equalsIgnoreCase(outputType)) {
                    content = JsonUtils.json2Xml(args[1], "root", "\t");
                } else if ("json".equalsIgnoreCase(inputType) && "csv".equalsIgnoreCase(outputType)) {
                    content = JsonUtils.json2Csv(args[1], ",");
                } else if ("json".equalsIgnoreCase(inputType) && "yaml".equalsIgnoreCase(outputType)) {
                    content = JsonUtils.json2Yaml(args[1]);
                } else if ("csv".equalsIgnoreCase(inputType) && "json".equalsIgnoreCase(outputType)) {
//                    content = CsvUtils.csv2Json(args[1], ",");
                    CsvUtils.csv2Json(args[1], args[2]);
                } else if ("csv".equalsIgnoreCase(inputType) && "xml".equalsIgnoreCase(outputType)) {
//                    content = CsvUtils.csv2Xml(args[1], ",");
                    CsvUtils.csv2Xml(args[1], args[2]);
                } else if ("csv".equalsIgnoreCase(inputType) && "yaml".equalsIgnoreCase(outputType)) {
//                    content = CsvUtils.csv2Yaml(args[1], ",");
                    CsvUtils.csv2Yaml(args[1], args[2]);
                } else if ("xml".equalsIgnoreCase(inputType) && "json".equalsIgnoreCase(outputType)) {
                    content = XmlUtils.xml2Json(args[1]);
                } else if ("xml".equalsIgnoreCase(inputType) && "csv".equalsIgnoreCase(outputType)) {
                    content = XmlUtils.xml2Csv(args[1]);
                } else if ("xml".equalsIgnoreCase(inputType) && "yaml".equalsIgnoreCase(outputType)) {
                    content = XmlUtils.xml2Yaml(args[1]);
                } else if ("yaml".equalsIgnoreCase(inputType) && "json".equalsIgnoreCase(outputType)) {
                    content = YamlUtils.yaml2Json(args[1]);
                } else if ("yaml".equalsIgnoreCase(inputType) && "csv".equalsIgnoreCase(outputType)) {
                    content = YamlUtils.yaml2Csv(args[1]);
                } else if ("yaml".equalsIgnoreCase(inputType) && "xml".equalsIgnoreCase(outputType)) {
                    content = YamlUtils.yaml2Xml(args[1], "root");
                } else {
                    System.out.println("本程序暂不支持 " + inputType + " 转 " + outputType);
                }
            } else {
                System.out.println("本程序暂时没有该功能！现有功能[-t|-c|-f|-v]");
            }
            if (content != null) {
                FileUtils.saveToFile(args[2], content, "UTF-8");
            }
        }
    }
}
